package list;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.function.Consumer;

import org.junit.Test;

public class ArrayListDemo {
	@Test
	public void create() {
		// 接口/父类引用 = 实现类/子类对象
		List<Integer> list = new ArrayList<>();  // 数组是0个长度 {},size=0
		list.add(1);   // 10
		list.add(2);
		list.add(3);
		list.add(4);
		list.add(2);
		System.out.println(list);
		
		List<Integer> list2 = new ArrayList<>(100);  // 数组是100个长度,size=100
		list2.add(1);   // 10
		list2.add(2);
		list2.add(3);
		list2.add(4);
		list2.add(2);
		System.out.println(list2);
		
		List<Integer> list3 = new ArrayList<>(list2); // 其他集合构造自己集合
		System.out.println(list3);
	}
	
	@Test
	public void methods() {
		List<Integer> list = new ArrayList<>(20); 
		list.add(11);
		list.add(26);
		list.add(34);
		list.add(2);
		list.add(14);
		list.add(29);
		// 设置
		list.set(0, 100);
		System.out.println("元素个数:" + list.size());
		System.out.println("第一个:" + list.get(0));
		System.out.println("找元素下标:" + list.indexOf(2));
		System.out.println("是否包含:" + list.contains(3));
		System.out.println("截取子列表:" + list.subList(0, 4));
		// 删除
		list.remove(0);
		System.out.println(list);
		System.out.println("是否空集合:" + list.isEmpty());
		// 排序
		list.sort(new Comparator<Integer>() {
			@Override   // 前-后：从小到大， 后-前：从大到小
			public int compare(Integer o1, Integer o2) {
				return o2 - o1;
			}
		});
		System.out.println(list);
		// 转成数组
		Object[] array = list.toArray();
		// 清空
		list.clear();
		System.out.println(list);
	}
	
	@Test
	public void forEach() {
		List<Integer> list = new ArrayList<>(20); 
		list.add(11);
		list.add(26);
		list.add(34);
		list.add(2);
		list.add(14);
		list.add(29);
		
		// 1.for循环走下标
		for (int i = 0; i < list.size(); i++) {
			System.out.println(list.get(i));
		}
		System.out.println("---------------");
		
		// 2.增强for循环
		for (Integer i : list) {
			System.out.println(i);
		}
		System.out.println("---------------");
		
		// 3.迭代器
		Iterator<Integer> it = list.iterator();
		while(it.hasNext()) {
			System.out.println(it.next());
		}
		System.out.println("---------------");
		
		// 4.列表迭代器
		ListIterator<Integer> it2 = list.listIterator();
		while(it2.hasNext()) {
			System.out.println(it2.next());
		}
		while(it2.hasPrevious()) {
			System.out.println(it2.previous());
		}
		System.out.println("---------------");
		
		
		// 5.jdk8 forEach   
		list.forEach(new Consumer<Integer>() {
			@Override
			public void accept(Integer t) {
				System.out.println(t);
			}
		});
	}
}
